package main

import (
	"fmt"
	"regexp"
	"strings"
	"time"
)

// ParseEmailDate 尝试把常见邮件/HTTP 风格的日期字符串解析为 time.Time。
// 它会预先剔除末尾类似 " (UTC)" 的括号注释，然后按多个格式尝试解析。
func ParseEmailDate(s string) (time.Time, error) {
	// 去掉首尾空白
	s = strings.TrimSpace(s)

	// 删除末尾的括号注释，例如 " (UTC)"、" (GMT)"、" (XYZ)"，以及可能的多余空格
	// 使用正则去掉最后一个 空格 + 括号内容
	re := regexp.MustCompile(`\s*\([^)]+\)$`)
	s = re.ReplaceAllString(s, "")

	// 归一化：将星期 + 日（可能为 1 位）规范为两位日，例如 "Thu, 2 Oct 2025 ..." -> "Thu, 02 Oct 2025 ..."
	// 匹配类似 "Mon, 2 Jan 2006 ..." 或 "Mon, 12 Jan 2006 ..."
	dayRe := regexp.MustCompile(`^([A-Za-z]{3},\s*)(\d{1,2})(\s+.+)$`)
	if m := dayRe.FindStringSubmatch(s); m != nil {
		day := m[2]
		if len(day) == 1 {
			day = "0" + day
			s = m[1] + day + m[3]
		}
	}

	// 常见格式列表（按成功率顺序）
	formats := []string{
		time.RFC1123Z,                           // "Mon, 02 Jan 2006 15:04:05 -0700"
		time.RFC1123,                            // "Mon, 02 Jan 2006 15:04:05 MST"
		time.RFC822Z,                            // "02 Jan 06 15:04 -0700"
		time.RFC822,                             // "02 Jan 06 15:04 MST"
		time.RFC3339,                            // "2006-01-02T15:04:05Z07:00"
		"Mon, 02 Jan 2006 15:04:05 -0700 (MST)", // 保险起见（虽然括号已剔除）
		"Mon, 2 Jan 2006 15:04:05 -0700",        // 兼容不零位填充的格式（作为兜底）
	}

	var parseErr error
	for _, f := range formats {
		if t, err := time.Parse(f, s); err == nil {
			return t, nil
		} else {
			parseErr = err
		}
	}
	// 若上述都失败，尝试更宽松的手工拆分：把最后的时区数字形式规范化再解析
	// 例如将 " +0000" 保持，已经在 formats 中包含 RFC1123Z，因此通常不会到这里。
	return time.Time{}, fmt.Errorf("无法解析时间 %q: %v", s, parseErr)
}
